Om lekker met Ansible te kunnen werken is het gebruik van playbooks aan te raden.
Een eenvoudig playbook, met toch een aantal leuke features kan er als volgt uit zien:
--- # Test playbook - hosts: '{{ myhosts }}' remote_user: ansible become: yes become_method: sudo connection: ssh gather_facts: '{{ gather }}' vars: myhosts: test12 gather: yes pkg: telnet tasks: - name: Some description of what we are doing yum: name: '{{ pkg }}' state: '{{ mystate }}'
Zoals je kunt zien zijn er een aantal dingen. Als eerste gebruiken we een aantal variables. Hiermee kunnen we dus leuke dingen doen, maar zoals je ook kunt zien wordt er 1 variable niet gezet. Dat leg ik later uit.
Regel 2. Hier geven we met een variabele aan welke host we willen gaan gebruiken.
Regel 3-6. Hiermee regelen we dat we met privileged rechten dingen kunnen doen, doormiddel van sudo.
Regel 7. Hiermee halen we informatie op vanuit onze hosts
Regel 8-11. Hier declareren we de variabelen. Zoals je kunt zien 1 minder dan je zou verwachten.
Regel 12-16. Geven we de taak aan, het installeren van het pakket dat we onder de variable pkg gedeclareerd hebben.
Sla vervolgens dit bestand op onder /home/ansible/ansible/playbook/test.yaml
Wat is hier nou het idee van. Ik wil dat ik snel telnet kan installeren maar ook weer kan deinstalleren. Dit doen we door het volgende commando te geven.
ansible-playbook test.yaml --extra-vars "mystate=latest"
Hiermee wordt telnet op alle hosts geïnstalleerd. Daarna kunnen we de volgende opdracht geven, waarna telnet op alle hosts weer gedeïnstalleerde wordt.
ansible-playbook test.yaml --extra-vars "mystate=absent"
Probleem is nu dat we alleen maar kunnen zien dat een tasks wel op niet gelukt is, we kunnen echter niet zien wat er precies wordt uitgevoerd. Dit kunnen we realiseren door een aantal regels toe te voegen aan het playbook.
--- # Test playbook - hosts: '{{ myhosts }}' remote_user: ansible become: yes become_method: sudo connection: ssh gather_facts: '{{ gather }}' vars: myhosts: test12 gather: yes pkg: telnet tasks: - name: Some description of what we are doing yum: name: '{{ pkg }}' state: '{{ mystate }}' register: result - debug: var=result
Hiermee maken we een nieuwe task welke de debug informatie over onze andere task ophaalt.
Ook kan het wel eens nodig zijn om wat meer controle te krijgen over of task wel of niet gestart moeten worden. Dit kan met behulp van notification en handlers. Het idee hierbij is dat een handler gestart wordt aan de hand van de status van een task.
Een playbook kan er dan als volgt uitzien. Sla dit bestand op als nginx.yaml
--- # Test playbook - hosts: '{{ myhosts }}' remote_user: ansible become: yes become_method: sudo connection: ssh gather_facts: '{{ gather }}' vars: myhosts: test12 gather: yes tasks: - name: Some description of what we are doing yum: name: nginx state: latest notify: - restart nginx handler: - name: restart nginx service: name: nginx enable: yes state: restart
Hierbij zien we dus dat nginx gestart wordt en als dat gebeurd is, dan pas wordt de service nginx herstart.
Als we nu dit playbook start met
ansible-playbook nginx.yaml
Dan zullen we zie dat nginx geinstalleerd en gestart wordt, de handler wordt uitgevoerd. Als we nogmaals het commando geven zullen we zien dat alleen de task uitgevoerd wordt maar de handler niet. We hebben dus een soort if…then… statement gemaakt.
Als je nginx vervolgens toch wil deinstalleren, kun je het volgende commando gebruiken:
ansible -s -m yum -a "name=nginx state=absent"